package cn.demoncat.util.lang;

import cn.demoncat.util.lang.constant.StringConstant;

import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;

/**
 * Collectors扩展
 *
 * @author 延晓磊
 * @since 2021年11月03日
 */
public class CollectorUtil {

    /**
     * 以","分隔的String
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年11月03日
     */
    public static Collector<CharSequence, ?, String> joinComma() {
        return Collectors.joining(StringConstant.COMMA);
    }

    /**
     * 以"/"分隔的String
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年11月03日
     */
    public static Collector<CharSequence, ?, String> joinSeparator() {
        return Collectors.joining(StringConstant.SEPARATOR);
    }

    /**
     * 以" "分隔的String
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年11月03日
     */
    public static Collector<CharSequence, ?, String> joinSpacing() {
        return Collectors.joining(StringConstant.SPACING);
    }

    /**
     * Map = {key, o}
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年11月03日
     */
    public static <T,K>Collector<T, ?, Map<K,T>> toMap(Function<T, K> keyMapper) {
        return toMap(keyMapper, o -> o);
    }

    /**
     * Map = {key, value}
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年11月03日
     */
    public static <T,K,U>Collector<T, ?, Map<K,U>> toMap(Function<T, K> keyMapper, Function<T,U> valueMapper) {
        return Collectors.toMap(keyMapper, valueMapper, (v1,v2) -> v1);
    }

    /**
     * Map = {'key', o}
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年11月03日
     */
    public static <T,K>Collector<T, ?, Map<String,T>> toStrMap(Function<T, K> keyMapper) {
        return toStrMap(keyMapper, o -> o);
    }

    /**
     * Map = {'key', value}
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年11月03日
     */
    public static <T,K,U>Collector<T, ?, Map<String,U>> toStrMap(Function<T, K> keyMapper, Function<T,U> valueMapper) {
        return toMap(o -> StringUtil.toString(keyMapper.apply(o)), valueMapper);
    }
}
